package com.esgov.chatbot;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Eric Lao
 * @since 2023/3/14 19:38
 */
public class AiChatBotCodeGenerator {

    public static void main(String[] args) {
        String author = "Eric Lao";
        String projectPath = "D:/Develop/SomeDemo/chatbot-demo"; // 项目地址
        String packageParent = "com.esgov.chatbot"; //生成的entity、controller、service等包所在的公共上一级包路径全限定名
        String controllerPackage = "api";
        String entityPackage = "entity";
        String servicePackage = "service";
        String serviceImplPackage = "service.impl";
        String mapperPackage = "dao";
        //数据库配置
        String url = "jdbc:mysql://192.168.115.190:8011/ai_console_db?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false";
        String driverClassName = "com.mysql.cj.jdbc.Driver";
        String username = "aiconsole";
        String password = "airx5G#0";
        String[] tableNames = {"t_chatbot_log"};//表名，多个使用英文逗号分隔

        // 1、创建代码生成器
        AutoGenerator generator = new AutoGenerator();

        // 2、全局配置
        GlobalConfig globalConfig = new GlobalConfig();
        globalConfig.setOutputDir(projectPath + "/src/main/java");
        globalConfig.setAuthor(author);
        globalConfig.setOpen(false); //生成后是否打开输出目录
        globalConfig.setFileOverride(false); //是否覆盖已有文件，默认false
        globalConfig.setServiceName("%sService"); //去掉Service接口的首字母I
        globalConfig.setMapperName("%sDao");
        globalConfig.setBaseResultMap(false); //开启 BaseResultMap
        globalConfig.setIdType(IdType.ASSIGN_UUID); //主键策略
        globalConfig.setDateType(DateType.ONLY_DATE); //定义生成的实体类中日期类型
        globalConfig.setSwagger2(true); //开启Swagger2模式
        generator.setGlobalConfig(globalConfig);

        // 3、数据源配置
        DataSourceConfig dataSourceConfig = new DataSourceConfig();
        dataSourceConfig.setUrl(url);
        dataSourceConfig.setDriverName(driverClassName);
        dataSourceConfig.setUsername(username);
        dataSourceConfig.setPassword(password);
        dataSourceConfig.setDbType(DbType.MYSQL);
        generator.setDataSource(dataSourceConfig);

        // 4、包配置
        PackageConfig packageConfig = new PackageConfig();
        // packageConfig.setModuleName("faq"); //模块名
        packageConfig.setParent(packageParent);
        packageConfig.setController(controllerPackage);
        packageConfig.setEntity(entityPackage);
        packageConfig.setService(servicePackage);
        packageConfig.setServiceImpl(serviceImplPackage);
        packageConfig.setMapper(mapperPackage);
        generator.setPackageInfo(packageConfig);

        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };
        // 如果模板引擎是 freemarker
        // String templatePath = "/templates/mapper.xml.ftl";
        // 如果模板引擎是 velocity
        String templatePath = "/templates/mapper.xml.vm";

        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 ， 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化！！
                return projectPath + "/src/main/resources/mapper/" + tableInfo.getEntityName() + "Dao" + StringPool.DOT_XML;
            }
        });

        cfg.setFileOutConfigList(focList);
        generator.setCfg(cfg);

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();

        templateConfig.setXml(null);
        generator.setTemplate(templateConfig);

        // 5、策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setInclude(tableNames);
        strategy.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略
        // strategy.setTablePrefix(pc.getModuleName() + "_"); //生成实体时去掉表前缀

        strategy.setColumnNaming(NamingStrategy.underline_to_camel);//数据库表字段映射到实体的命名策略
        strategy.setEntityLombokModel(true); // lombok 模型 @Accessors(chain = true) setter链式操作

        strategy.setRestControllerStyle(true); //restful api风格控制器
        // strategy.setControllerMappingHyphenStyle(true); //url中驼峰转连字符

        generator.setStrategy(strategy);

        // 6、执行
        generator.execute();
    }
}
